# -*- coding: utf-8 -*-
import os

from flask import current_app
from flask_login import current_user
from flask_wtf import FlaskForm
from flask_wtf.file import FileAllowed
from werkzeug.utils import secure_filename
from wtforms import StringField, FileField, TextAreaField
from wtforms.validators import DataRequired, Length
from flask_ckeditor.fields import CKEditorField
from models import Question, db, QuestionTags, Answer


class WriteQuestionForm(FlaskForm):
    """ 写文章 """
    img = FileField(label="上传图片", render_kw={
        'accept': ".jpeg, .jpg, .png"
    },validators=[FileAllowed(['png', 'jpg', 'jpeg'],"请输入jpeg, .jpg, .png的图片类型")])
    title = StringField(label='标题', render_kw={
        "class": "form-control",
        "placeholder":"请输入标题（最多50个字）"
    },validators=[DataRequired("请输入标题"),
                  Length(min=2,max=50,message="标题长度为2~50个字符")])
    tags = StringField(label='标签', render_kw={
        "class": "form-control",
        "placeholder":"输入标签，用,分隔"
    })
    desc = TextAreaField(label='描述', render_kw={
        "class": "form-control",
        "placeholder":"简述"
    },validators=[Length(max=150,message="最大只能输入150个字符")])
    content = CKEditorField(label='文章内容', render_kw={
        "class": "form-control",
        "placeholder":"请输入正文"
    },validators=[Length(min=5,message="最小要输入5个字符"),
                  DataRequired("请输入正文内容")])


    def save(self):
        """ 发布问题，保存数据库的"""
        # 1.获取图片
        img=self.img.data
        if img:
            # 获取图片的路径,给一个安全的文件名
            img_name=secure_filename(img.filename)
            # 加载全局的变量
            img_path=os.path.join(current_app.config['MEDIA_ROOT'],img_name)
            # 保存图片，form自带的方法
            img.save(img_path)

        # 2.保存问题
        title=self.title.data
        desc=self.desc.data
        content=self.content.data
        # 保存图片通常是保存图片的名称
        que_obj=Question(title=title,desc=desc,content=content,img=img_name,is_valid=True)
        db.session.add(que_obj)


        # 3.保存标签
        tags=self.tags.data
        # 一个问题可以有很多个标签
        for tag_name in tags.split('，'):
            tag_obj=QuestionTags(tag_name=tag_name,question=que_obj)
            db.session.add(tag_obj)
        db.session.commit()
        return que_obj


# 回答问题
class AnswerWriteForm(FlaskForm):
    # 回答问题的富文本
    content = CKEditorField(label='回答内容'
            ,validators=[Length(min=5,message="最小要输入5个字符"),
            DataRequired("回答内容不能为空")])

    # 保存内容
    def save(self,question):
        content=self.content.data
        # 获取当前的用户
        user=current_user
        answer_obj=Answer(content=content,user=user,question=question)
        db.session.add(answer_obj)
        db.session.commit()
        return answer_obj


